#pragma once

#include "common/macros.h"

namespace optimizer {

template <class Constructor, class Destructor>
struct ScopedDefer {
  Destructor destructor_;

  explicit ScopedDefer(Destructor f1) : destructor_(f1) {}
  ScopedDefer(Constructor f1, Destructor f2) : destructor_(f2) { f1(); }

  ~ScopedDefer() { destructor_(); }

  DISALLOW_COPY_AND_MOVE(ScopedDefer)
};

}  // namespace optimizer